package com.ql.fanxing;

/**
 * 泛型类的定义和使用
 * 泛型有三种使用方式，分别为：泛型类、泛型接口、泛型方法
 * //定义一个泛型类十分简单，只需要在类名后面加上<>，再在里面加上类型参数：
 * @param <T>
 */
public class Pair<T> {
    public T value;

    public Pair(T value) {
        this.value = value;
    }
    //泛型上下边界   泛型的上下边界添加，必须与泛型的声明在一起
    public void showKeyValue1(Pair<? extends Number> obj){
        System.out.println("泛型测试 key value is " + obj.getValue());
    }

    //泛型方法与可变参数    <T>泛型的声明
    public <T> void printMsg( T... args){
        for(T t : args){
            System.out.println("泛型测试 t is " + t);
        }
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }



    public static void main(String[] args) {
        Pair<String> pair = new Pair<String>("Hello ");
        System.out.println(pair.getValue());

        pair.setValue("World");
        System.out.println(pair.getValue());

        Pair<Number> pair0 = new Pair<Number>(110);
        System.out.println(pair0.getValue());
        pair0.printMsg(124.1f ,123,1000l,122d);

        pair0.showKeyValue1(new  Pair<Number>(125f));
//        pair0.showKeyValue1(new Pair<String>("ddddd") ); //error


    }
}
